﻿namespace Oddo.Concept.Crm.Common.Modules
{
    using Microsoft.Practices.Prism.Modularity;
    using Microsoft.Practices.Prism.Regions;
    using Microsoft.Practices.Prism.UnityExtensions;
    using Microsoft.Practices.Unity;

    /// <summary>
    /// Classe de base pour un module
    /// </summary>
    public abstract class ModuleBase : IModule
    {
        /// <summary>
        /// Obtient le container d'injection de dependance Unity
        /// </summary>
        [Dependency]
        public IUnityContainer Container { get; set; }

        /// <summary>
        /// Initialise le module
        /// </summary>
        public virtual void Initialize()
        {
            RegisterTypes(Container);
        }
        /// <summary>
        /// Utilise le container d'injection de dependances pour enregistrer des Types.
        /// </summary>
        /// <param name="container">L'instance de type IUnityContainer d'injection de dépendances</param>
        public abstract void RegisterTypes(IUnityContainer container);
    }

    public interface IServerModule  : IModule
    {
    }

    public abstract class ServerModuleBase : ModuleBase, IServerModule
    {
    }

    public abstract class ClientModuleBase : ModuleBase
    {
        /// <summary>
        /// Initialise le module
        /// </summary>
        public override void Initialize()
        {
            RegisterTypes(Container);
            RegisterRegions(Container.TryResolve<IRegionManager>());
            ExtendUserInterface();
        }
        /// <summary>
        /// Enregistre des vues sur des regions de l'interface utilisateur
        /// </summary>
        /// <param name="regionManager"></param>
        public abstract void RegisterRegions(IRegionManager regionManager);
        /// <summary>
        /// Etend l'interface utilisateur
        /// </summary>
        public abstract void ExtendUserInterface();
    }


    
}